package cn.itcast.listener;

import cn.itcast.pojo.OrderSetting;
import cn.itcast.service.OrderSettingService;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.List;

//easyExcel监听器
public class OrderSettingListener extends AnalysisEventListener<OrderSetting>  {

    //成员变量
    private OrderSettingService orderSettingService;


    /**
     * 每隔5条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 31;
    //解析完后存放的集合
    List<OrderSetting> list = new ArrayList<>();


    //这个监听器的空参方法
    public OrderSettingListener() {
    }

    //这个监听器的有参方法
    public OrderSettingListener(OrderSettingService orderSettingService) {
        this.orderSettingService = orderSettingService;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param orderSetting    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(OrderSetting orderSetting, AnalysisContext context) {

        list.add(orderSetting);
        // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
        if (list.size() >= BATCH_COUNT) {

            // 存储完成清理 list
            list.clear();
        }
    }



    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        //因为保存数据需要Dao 这个模块是没有Dao的 只能把解析完后的集合 传递给service层处理
         orderSettingService.upLoad(list);
    }


}

